"""
视图层
"""

import sys
from PyQt6.QtWidgets import QWidget, QApplication, QMessageBox
from PyQt6.QtCore import Qt
from ui.login import Ui_Form as UI_FormMixin  # 导入ui设计师生成的文件
from libs import common
from conf import settings
from interface import (
    admin_interface,
    student_interface,
    teacher_interface,
    common_interface,
)


logger = common.get_logger("视图层")


class LoginWindow(UI_FormMixin, QWidget):

    def __init__(self):
        super(LoginWindow, self).__init__()
        self.setupUi(self)
        self.setWindowFlag(Qt.WindowType.FramelessWindowHint)  # 隐藏边框
        self.admin_is_here = False  # 管理员是否存在标志

        self.login_window_init()  # 初始化登录窗口

    # 初始化登录窗口
    def login_window_init(self):
        self.lineEdit.setText(settings.LOGIN_USER)
        user_type_dic = {
            "Student": self.checkBox,
            "Teacher": self.checkBox_2,
            "Admin": self.checkBox_3,
        }
        user_type_dic.get(settings.LOGIN_TYPE).setChecked(True)  # 设置默认选中项

    # 获取用户类型
    def get_user_type(self):
        checkbox = (
            self.checkBox.isChecked()
        )  # isChecked()方法用于获取复选框的状态，返回True或False
        checkbox_2 = self.checkBox_2.isChecked()
        checkbox_3 = self.checkBox_3.isChecked()
        user_type_dic = {
            "Student": checkbox,
            "Teacher": checkbox_2,
            "Admin": checkbox_3,
        }
        for user_type in user_type_dic:
            if user_type_dic.get(user_type):
                return user_type

    # 登录功能
    def login(self):
        # 获取用户名和密码
        username = self.lineEdit.text().strip()
        password = self.lineEdit_2.text().strip()

        user_type = self.get_user_type()

        # 判断用户名和密码是否为空
        if not username or not password:
            QMessageBox.warning(self, "警告", "用户名或密码不能为空！")
            return

        # 对密码进行加密
        password = common.pwd_to_sha256(password)

        # 调用逻辑接口层接口进行登录
        flag, msg = common_interface.login_interface(username, password, user_type)
        if not flag:
            QMessageBox.warning(self, "警告", msg)
            return

        # 登录成功
        settings.config.set("USER", "LOGIN_USER", username)
        settings.config.set("USER", "LOGIN_TYPE", user_type)
        with open(
            settings.CONFIG_PATH_DIR, "w", encoding="utf-8-sig"
        ) as f:  # utf-8和utf-8-sig的区别是前者会在文件开头添加BOM，后者不会
            settings.config.write(f)  # 保存配置文件

        # 登录成功，判断是否有学校
        flog, msg = common_interface.check_obj_is_exist("School")
        if not flog:
            # 如果没有学校，并且是管理员，则跳转到添加学校页面
            if user_type == "Admin":
                pass

        logger.debug(f"点击了登录按钮！用户名：{username}，密码：{password}")

    # 打开注册页面
    def open_register_page(self):
        self.stackedWidget.setCurrentIndex(1)
        self.lineEdit_3.setFocus()  # 自动聚焦到用户名输入框
        logger.debug("点击了注册按钮")

        # 判断是否存在管理员
        flog, msg = common_interface.check_obj_is_exist("Admin")
        # 如果管理员存在，则把注册页面的标题改为学员注册
        if flog:
            self.label_2.setText("学生注册")
            self.admin_is_here = True

    # 打开登录页面
    def open_login_page(self):
        self.stackedWidget.setCurrentIndex(0)
        logger.debug("点击了登录页面按钮")

    # 注册功能
    def register(self):
        username = self.lineEdit_3.text()
        password = self.lineEdit_4.text()
        re_password = self.lineEdit_5.text()

        # 判断两次密码是否一致
        if password != re_password:
            # 弹窗提醒用户两次密码不一致
            QMessageBox.about(self, "警告", "两次密码不一致！")
            return

        import re

        if not re.findall(r"^[a-zA-Z0-9_-]{3,12}$", username):
            # findall()函数用于查找字符串中所有匹配正则表达式的子串，并返回一个列表
            # 正则表达式：^[a-zA-Z0-9_-]{3,12}$ 匹配用户名，用户名必须由字母、数字、下划线、减号组成，长度在3-12位之间
            QMessageBox.about(
                self,
                "警告",
                "用户名必须由字母、数字、下划线、减号组成，长度在3-12位之间！",
            )
            return

        # 校验密码强度
        if not re.findall(r"^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,16}$", password):
            # 正则表达式：^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,16}$ 匹配密码，密码必须包含大小写字母、数字，长度在8-16位之间
            QMessageBox.about(
                self, "警告", "密码必须包含大小写字母、数字，长度在8-16位之间！"
            )
            return

        # 调用函数对密码进行加密
        password = common.pwd_to_sha256(password)

        if self.admin_is_here:
            # 调用学生注册接口
            flag, msg = student_interface.student_register_interface(username, password)
        else:
            # 调用接口函数进行注册
            flag, msg = admin_interface.admin_register_interface(username, password)
        QMessageBox.about(self, "提示", msg)
        # 注册成功后，跳转到登录页面
        if flag:
            self.stackedWidget.setCurrentIndex(0)
            # 注册成功后，清空输入框内容
            self.lineEdit_3.clear()
            self.lineEdit_4.clear()
            self.lineEdit_5.clear()
            # 将用户名自动填入登录页面的用户名输入框
            self.lineEdit.setText(username)
            self.lineEdit_2.setFocus()  # 自动聚焦到密码输入框
        else:
            return

    # def close(self):
    #     logger.debug("点击了关闭窗口按钮！")


def excep_hook(cls, exception, traceback):
    sys.___excepthook__(cls, exception, traceback)  # 调用系统默认的异常处理函数


def main():
    app = QApplication(sys.argv)

    login_window = LoginWindow()

    login_window.show()

    sys.excepthook = excep_hook  # 重新定义异常挂钩sys.excepthook

    sys.exit(app.exec())  # exec()方法进入消息循环，并等待事件处理
